package collection;

import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * @author Cheng Jun
 * Description: 学习优先队列
 * An unbounded priority queue based on a priority heap.
 * @version 1.0
 * @date 2021/12/5 11:27
 * @see PriorityQueue
 */
public class PriorityQueueStudy {

    public static void main(String[] args) {
        // 无参构造器，默认使用小根堆
        PriorityQueue<Integer> integerPriorityQueue = new PriorityQueue<>();
        integerPriorityQueue.add(1);
        integerPriorityQueue.add(3);
        integerPriorityQueue.add(2);
        // integerPriorityQueue.add(0);
        while (!integerPriorityQueue.isEmpty()) {
            Integer poll = integerPriorityQueue.poll();
            System.out.println(poll);
        }

        // 自定义比较器：按照数字大小倒序，也就是使用大根堆
        PriorityQueue<Integer> reversePriorityQueue = new PriorityQueue<>(Comparator.reverseOrder());
        reversePriorityQueue.add(1);
        reversePriorityQueue.add(3);
        reversePriorityQueue.add(2);
        reversePriorityQueue.add(0);
        while (!reversePriorityQueue.isEmpty()) {
            Integer poll = reversePriorityQueue.poll();
            System.out.println(poll);
        }

        // 自定义 初始化数组大小，设置initialCapacity 的意义在于——如果开发者能提前预估 PriorityQueue 的大小，可以减少扩容，提升性能
        PriorityQueue<Integer> sizePriorityQueue = new PriorityQueue<>(4);
        sizePriorityQueue.add(1);
        sizePriorityQueue.add(3);
        sizePriorityQueue.add(2);
        sizePriorityQueue.add(0);
        sizePriorityQueue.add(4);
        while (!sizePriorityQueue.isEmpty()) {
            Integer poll = sizePriorityQueue.poll();
            System.out.println(poll);
        }

    }
}
